`ifndef ID_EX_V
`define ID_EX_V


`include "defines.v"

module id_ex(
	input wire clk,
	input wire rstn,
    
	//from id
	input wire[`InstAddrWidth - 1 : 0] 	inst_addr_i,
	input wire[`InstWidth - 1 : 0] 		inst_i,
	input wire[`RegAddrWidth - 1 : 0] 	reg_waddr_i,
	input wire 		 					reg_wen_i,
	// input  wire[`RegDataWidth - 1 : 0] reg1_rdata_i,
	// input  wire[`RegDataWidth - 1 : 0] reg2_rdata_i,
	input wire[`OPWidth - 1 : 0] 		op1_i,	
	input wire[`OPWidth - 1 : 0] 		op2_i,
	
	//from ctrl
	input wire 							hold_flag_i,
	
	//to ex
	output wire[`InstAddrWidth - 1 : 0] inst_addr_o,
	output wire[`InstWidth - 1 : 0] 	inst_o,
	output wire[`RegAddrWidth - 1 : 0]  reg_waddr_o,	
	output wire 	  					reg_wen_o,
	// output reg[`RegDataWidth - 1 : 0] reg1_rdata_o,
	// output reg[`RegDataWidth - 1 : 0] reg2_rdata_o,	
	output wire[`OPWidth - 1 : 0] 		op1_o,	
	output wire[`OPWidth - 1 : 0] 		op2_o
	
);

// 指令地址传递
pipe_dff #(`InstAddrWidth) inst_addr_dff(
    .clk        (clk)               ,		
    .rstn	    (rstn)              ,
    .hold_flag_i(hold_flag_i)    	,
    .def_data   (`INST_ZERO_ADDR)   ,
    .data_i     (inst_addr_i)       ,
    .data_o	    (inst_addr_o)
);

// 指令传递
pipe_dff #(`InstWidth) inst_dff(
    .clk        (clk)       	,		
    .rstn	    (rstn)      	,
    .hold_flag_i(hold_flag_i)   ,
    .def_data   (`INST_NOP) 	,
    .data_i     (inst_i)    	,
    .data_o	    (inst_o)
);

// 回写地址传递
pipe_dff #(`RegAddrWidth) reg_waddr_dff(
    .clk        (clk)           ,		
    .rstn	    (rstn)          ,
    .hold_flag_i(hold_flag_i)   ,
    .def_data   (`REG_X0_ADDR)    ,
    .data_i     (reg_waddr_i)   ,
    .data_o	    (reg_waddr_o)
);

// 回写使能传递
pipe_dff #(1) reg_wen_dff(
    .clk        (clk)       	,		
    .rstn	    (rstn)      	,
    .hold_flag_i(hold_flag_i)   ,
    .def_data   (1'b0)      	,
    .data_i     (reg_wen_i) 	,
    .data_o	    (reg_wen_o)
);

// 寄存器值 1 传递
// pipe_dff #(RegDataWidth) reg1_rdata_dff(
//     .clk        (clk)           ,		
//     .rstn	    (rstn)          ,
//     .hold_flag_i	(hold_flag_i)          ,
//     .def_data   (`R_X0_DATA)    ,
//     .data_i     (reg1_rdata_i)  ,
//     .data_o	    (reg1_rdata_o)
// );

// 寄存器值 2 传递
// pipe_dff #(RegDataWidth) reg2_rdata_dff(
//     .clk        (clk)           ,		
//     .rstn	    (rstn)          ,
//     .hold_flag_i	(hold_flag_i)          ,
//     .def_data   (`R_X0_DATA)    ,
//     .data_i     (reg2_rdata_i)  ,
//     .data_o	    (reg2_rdata_o)
// );

// 操作数 1 传递
pipe_dff #(`OPWidth) op1_dff(
    .clk        (clk)       	,		
    .rstn	    (rstn)      	,
    .hold_flag_i(hold_flag_i)   ,
    .def_data   (`OP_ZERO)  	,
    .data_i     (op1_i)     	,
    .data_o	    (op1_o)
);

// 操作数 2 传递
pipe_dff #(`OPWidth) op2_dff(
    .clk        (clk)       	,		
    .rstn	    (rstn)      	,
    .hold_flag_i(hold_flag_i)   ,
    .def_data   (`OP_ZERO)  	,
    .data_i     (op2_i)     	,
    .data_o	    (op2_o)
);

endmodule


`endif // ID_EX_V